package cn.topcodes.tcsf.admin.commons.convertor;

import cn.topcodes.tcsf.admin.commons.domain.Page;
import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;

/**
 * 实体->Vo转换器
 * @author Unicorn
 * @date 2017/4/10
 */
public abstract class Entity2VoConvertor<T,V> {

    /**
     * 转换分页数据
     * @param pageEntity    分页实体数据
     * @return     分页Vo数据
     */
    public Page<V> convertPage(Page<T> pageEntity) {
        Assert.notNull(pageEntity);
        List<V> rows = convertList(pageEntity.getRows());
        return new Page<V>(rows,pageEntity.getTotal(),pageEntity.getPageNumber(),pageEntity.getPageSize());
    }

    /**
     * 转换列表数据
     * @param entitys   实体列表数据
     * @return  vo列表数据
     */
    public List<V> convertList(List<T> entitys) {
        Assert.notNull(entitys);
        List<V> vos = new ArrayList<V>();
        for(T entity : entitys) {
            vos.add(convert(entity));
        }
        return vos;
    }

    /**
     * 转换对象
     * @param entity    实体
     * @return  Vo
     */
    public V convert(T entity) {
        Assert.notNull(entity);
        try {
            V vo = this.getVoClass().newInstance();
            BeanUtils.copyProperties(entity,vo);
            diff(entity,vo);
            return vo;
        } catch (Exception e) {
            throw new IllegalStateException("实体类型定义有误", e);
        }
    }

    /**
     * 仅处理不同字段
     * @param entity    实体
     * @param vo        Vo
     */
    public void diff(T entity, V vo) {

    }

    /**
     * 获取Vo的Class
     * @return Vo的Class
     */
    @SuppressWarnings("unchecked")
    public Class<V> getVoClass() {
        Class<V> voClass = (Class<V>) ((ParameterizedType) getClass().getGenericSuperclass())
                .getActualTypeArguments()[1];
        return voClass;
    }
}
